// 
// Entify project
//  
// Author:
//       Lauri Taimila <lauri@taimila.com>
// 
// Copyright (c) 2010 Lauri Taimila
// 
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// 
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
// 
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.

using System;

namespace Taimila.Entify
{
	/// <summary>
	/// Base of the entity context query mechanism. Client code creates EntityRequest
	/// objects and gives them to EntityContext to be processed.
	/// </summary>
	public sealed class EntityRequest<T>
	{
		/// <summary>
		/// Create new empty entity request.
		/// </summary>
		public EntityRequest()
		{
		}
		
		/// <summary>
		/// Create a new EntityRequest with paging and sorting filters.
		/// </summary>
		/// <param name="limit">
		/// Maximum number of entities returned. <see cref="System.Int32"/>
		/// </param>
		/// <param name="offset">
		/// Offset for returned entities. <see cref="System.Int32"/>
		/// </param>
		/// <param name="sortProperties">
		/// List of property names for sorting the results. <see cref="System.String[]"/>
		/// </param>
		public EntityRequest(int limit, int offset, params string[] sortProperties)
		{
			this.PagingFilter = new PagingFilter(limit, offset);
			this.SortFilter = new SortFilter(sortProperties);
		}
		
		/// <summary>
		/// Creates a new EntityRequest with given filters. Any of the parameters can be left null.
		/// </summary>
		/// <param name="dataFilter">
		/// Data filters can be used to filter result set of the EntityRequest. <see cref="IDataFilter"/>
		/// </param>
		/// <param name="sortFilter">
		/// Sort filter can be used to sort results of the EntityRequest. <see cref="SortFilter"/>
		/// </param>
		/// <param name="pagingFilter">
		/// Paging filter can be used to limit the number of entities returned by entity request. <see cref="PagingFilter"/>
		/// </param>
		public EntityRequest(IDataFilter dataFilter, SortFilter sortFilter, PagingFilter pagingFilter)
		{
			this.DataFilter = dataFilter;
			this.SortFilter = sortFilter;
			this.PagingFilter = pagingFilter;
		}
		
		/// <summary>
		/// Sort filter can be used to sort results of the EntityRequest.
		/// </summary>
		public SortFilter SortFilter
		{
			get;
			set;
		}
		
		/// <summary>
		/// Paging filter can be used to limit the number of entities
		/// returned by entity request. Paging filter is interpreted
		/// after all the other filters.
		/// </summary>
		public PagingFilter PagingFilter
		{
			get;
			set;
		}
		
		/// <summary>
		/// Data filters can be used to filter result set of the EntityRequest. Data 
		/// filters are interpreted before other filters.
		/// </summary>
		public IDataFilter DataFilter
		{
			get;
			set;
		}
	}
}
